#include "stm32f10x.h"                  // Device header
#include "MyFLASH.h"

// 定义存储SRAM数据的数组, 数组这些变量就是在SRAM里
uint16_t Store_Data[512];

// 目的是为了方便Flash的读写, 把Flash的数据放到SRAM里面, 想怎么读写就怎么读写, 
// 当SRAM的数据改变是, 就将SRAM的数据整体备份到Flash里面
// 下次上电的时候, 再将Flash的数据加载回到SRAM
// 再加上有个判断标志位, 判断闪存是不是保存过数据


/*
转存初始化函数
@brief: 先判断是不是初始化, 避免重复初始化Flash, 导致数据丢失
		标志位: Flash最后一页的第一个半字
*/
void Store_Init(void)
{
	if (MyFLASH_ReadHalfWord(LastPage) != 0xA8A8)		// 读取判断标志位: Flash最后一页的第一个半字
	{													// 如果不是A8A8, 则说明第一次使用, 就先初始化
		MyFlashErasePage(LastPage);						// 擦除最后一页
		MyFLASH_ProgramHalfWord(LastPage, 0xA8A8);		// 设置标志位
		for (uint16_t i = 1; i < 512; i ++)				// 注意是 i=1, i=0的位置是标志位0xA8A8
		{
			MyFLASH_ProgramHalfWord(LastPage + i * 2, 0x0000);
		}
	}
	
	// 如果标志位是 A8A8, 说明数据保存过了, 上电把所有数据加载回到SRAM
	// 加载数据
	for (uint16_t i = 0; i < 512; i ++)					// 为什么这里又是 i=0 开始了?
	{
		Store_Data[i] = MyFLASH_ReadHalfWord(LastPage + i * 2);
	}
}

/*
将SRAM的数据保存到Flash
*/
void Store_Save(void)
{
	MyFlashErasePage(LastPage);		// 先擦出最后一页
	for (uint16_t i = 0; i < 512; i ++)
	{
		MyFLASH_ProgramHalfWord(LastPage + i * 2, Store_Data[i]);
	}
}

/*
将SRAM的数据清零
*/
void Store_Clear(void)
{
	for (uint16_t i = 1; i < 512; i ++)		// i=1, 注意不要把标志位清零了
	{
		Store_Data[i] = 0x00;
	}
	Store_Save();
}
